package top.canyue.word_range.pojo.query;

import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.Data;

/**
 * 通用的分页查询条件分装
 * @author Canyue
 * @version 1.2 2024-09-08
 */

@Data
public class PageQuery {
    // 第几页
    private Integer pageNo = 1;

    // 页大小
    private Integer pageSize = 5;

    // 基于那个字段排序
    private String sort;     //TODO：多条件后续用列表分装

    // 是否升序
    private Boolean isAsc = true;

    /**
     * 构建查询用的Page
     * <p>虽然在MP中都是同一个Page类的实现，但可以理解为只分装了查询条件</p>
     * @param orderItems 排序字段
     * @return 查询用的Page
     * @param <PO> PO类型
     */
    public <PO> Page<PO> toMpPage(OrderItem ... orderItems){
        // 构建分页条件
        if(pageNo == null || pageNo < 1){
            pageNo = 1;
        }
        if(pageSize == null || pageSize < 1){
            pageSize = 5;
        }
        Page<PO> page = Page.of(pageNo, pageSize);
        // 构建排序条件
        if(sort != null){
            if(isAsc == null){
                this.setIsAsc(false);
            }
            page.addOrder(new OrderItem().setColumn(sort).setAsc(isAsc));
        }else if(orderItems != null && orderItems.length > 0){
            // 默认字段由调用者定义后传递
            page.addOrder(orderItems);
        }
        return page;
    }

    // 方便就一个排序字段时
    public <PO> Page<PO> toMpPage(String defaultSortBy, Boolean isAsc){
        return this.toMpPage(OrderItem.desc(defaultSortBy).setAsc(isAsc));
    }

    // 一些预设
    public <PO> Page<PO> toMpPageDefaultSortOrderByCreateTimeASC(){
        return this.toMpPage("create_time",true);
    }

    public <PO> Page<PO> toMpPageDefaultSortOrderByCreateTimeDESC(){
        return this.toMpPage("create_time",false);
    }

    public <PO> Page<PO> toMpPageDefaultSortOrderByRegisterDateASC(){
        return this.toMpPage("register_date",true);
    }

    public <PO> Page<PO> toMpPageDefaultSortOrderByRegisterDateDESC(){
        return this.toMpPage("register_date",false);
    }

    public <PO> Page<PO> toMpPageDefaultSortOrderByUpdateTimeASC(){
        return this.toMpPage("update_time",true);
    }

    public <PO> Page<PO> toMpPageDefaultSortOrderByUpdateTimeDESC(){
        return this.toMpPage("update_time",false);
    }

}
